﻿using System;
using System.Collections.Generic;
using System.Linq;
using GestorDeFlotasDesktop.Listados;
using System.Windows.Forms;
using Controllers;

namespace GestorDeFlotasDesktop
{
    public partial class AbmUsuario : Form
    {
        public AbmUsuario()
        {
            InitializeComponent();
        }

        #region Propiedades

        public lstUsuarios parentForm { get; set; }
        public Usuario Usuario { get; set; }
        public Operacion operacion { get; set; }
        private bool valido = true;

        #endregion

        #region Eventos

        private void AbmUsuario_Load(object sender, EventArgs e)
        {
            if (operacion == Operacion.Alta)
            {
                chkHabilitado.Checked = true;
                lblOperacion.Text = "Nuevo";
            }
            else
            {
                CargarForm();
                if (operacion == Operacion.Baja)
                {
                    InhabilitarForm();
                    lblOperacion.Text = "Eliminar";
                    btnLimpiar.Enabled = false;
                }
                else
                {
                    lblOperacion.Text = "Modificar";
                    txtUsername.Enabled = false;
                }
            }
            CargarRoles();
        }

        private void btnGuardar_Click(object sender, EventArgs e)
        {

            if (operacion == Operacion.Baja)
            {
                UsuarioController.Eliminar(Usuario.Usuario_Id);
                MessageBox.Show("El Usuario fue eliminado con éxito");
                if (parentForm != null) parentForm.ActualizarGrilla();
                Close();
            }
            else
            {

                ValidarForm(sender, e);
                if (valido)
                {
                    var lstRoles = (List<Rol>) gvwRoles.DataSource;

                    if (operacion == Operacion.Alta)
                    {
                        Usuario = CargarObjeto();
                        UsuarioController.Agregar(Usuario,lstRoles);
                        MessageBox.Show("El Usuario fue dado de alta con éxito");
                    }
                    else if (operacion == Operacion.Modificacion)
                    {
                        Usuario = CargarObjeto();
                        UsuarioController.Modificar(Usuario,lstRoles);
                        MessageBox.Show("El Usuario fue modificado con éxito");
                    }

                    LimpiarForm();
                    Usuario = null;
                    if (parentForm != null) parentForm.ActualizarGrilla();
                    Close();
                }
                valido = true;
            }



        }

        private void btnLimpiar_Click(object sender, EventArgs e)
        {
            LimpiarForm();
        }

        #endregion

        #region Metodos del Form

        private Usuario CargarObjeto()
        {
            if (Usuario == null) Usuario = new Usuario();

            Usuario.Usuario_UserName = txtUsername.Text;
            Usuario.Usuario_Password = UsuarioController.Hash(txtPassword.Text);
            Usuario.Usuario_Habilitado = chkHabilitado.Checked;

            return Usuario;
        }

        private void CargarForm()
        {
            txtUsername.Text = Usuario.Usuario_UserName;
            txtPassword.Text = Usuario.Usuario_Password;
            chkHabilitado.Checked = Usuario.Usuario_Habilitado;
        }

        private void LimpiarForm()
        {
            txtUsername.Text = "";
            txtPassword.Text = "";
            chkHabilitado.Checked = true;
            CargarRoles();
        }

        private void InhabilitarForm()
        {
            txtUsername.Enabled = false;
            txtPassword.Enabled = false;
            chkHabilitado.Enabled = false;
            gvwRoles.Enabled = false;
        }

        private void CargarRoles()
        {
            var usuarioId = operacion == Operacion.Alta ? 0 : Usuario.Usuario_Id;

            gvwRoles.AutoGenerateColumns = false;
            gvwRoles.DataSource = UsuarioController.ObtenerRolesHabilitados(usuarioId);

            var colId = new DataGridViewTextBoxColumn
            {
                DataPropertyName = "Rol_Id",
                Name = "Rol_Id",
                HeaderText = "Id",
                ReadOnly = true,
                Width = 50
            };
            gvwRoles.Columns.Add(colId);

            var colnombre = new DataGridViewTextBoxColumn
            {
                DataPropertyName = "Rol_Nombre",
                Name = "Rol_Nombre",
                HeaderText = "Rol",
                ReadOnly = true,
                Width = 150
            };
            gvwRoles.Columns.Add(colnombre);

            var colHabilitado = new DataGridViewCheckBoxColumn
            {
                DataPropertyName = "Rol_Seleccionado",
                Name = "Rol_Seleccionado",
                HeaderText = "Asignar",
                Width = 80
            };
            gvwRoles.Columns.Add(colHabilitado);
            
        }

        #endregion

        #region Validaciones


        private void ValidarForm(object sender, EventArgs e)
        {
            valido = true;
            txtUserName_Validated(sender, e);
            txtPassword_Validated(sender, e);
            ValidarRoles();
        }

        private void txtUserName_Validated(object sender, EventArgs e)
        {
            if (string.IsNullOrEmpty(txtUsername.Text))
            {
                errProvider.SetError(txtUsername, "Debe ingresar el nombre de usuario");
                valido = false;
            }
            else
            {
                errProvider.SetError(txtUsername, "");
            }
        }

        private void txtPassword_Validated(object sender, EventArgs e)
        {
            if (string.IsNullOrEmpty(txtPassword.Text))
            {
                errProvider.SetError(txtPassword, "Debe ingresar la password");
                valido = false;
            }
            else
            {
                errProvider.SetError(txtPassword, "");
            }
        }

        private void ValidarRoles()
        {
            var lstRoles = (List<Rol>)gvwRoles.DataSource;

            if (!lstRoles.Any(x=> x.Rol_Seleccionado))
            {
                errProvider.SetError(gvwRoles, "Debe seleccionar al menos un rol");
                valido = false;
            }
            else
            {
                errProvider.SetError(gvwRoles, "");
            }

        }

        #endregion

      
    }
}
